﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Configuration;
using UricaoWeb.Datos.Excepciones.ReportesyLimpieza;

namespace UricaoWeb.Datos.ConexionBD.Reportes_Graficos___Housekeeping___Limpieza
{
    public class ManejoBD
    {
        private SqlConnection _conexion;
        private string _stringConexion;
        private SqlCommand _comando;
        private string _query;

        ///<sumary>
        ///Constructor de la clase ManejoBD que se encarga de inicializar
        ///los componentes necesarios para la utilizacion de la misma
        ///Parámetros: 
        ///String query: Contiene el nombre de la BD para la conexion
        ///String conexion :
        ///</sumary>
        public ManejoBD(string query, string conexion)
        {
            _conexion = new SqlConnection();
            _stringConexion = conexion;
            _comando = null;
            _query = query;
        }


        #region IniciarConexion

        ///<sumary>
        ///Método que se encarga de iniciar la conexion con la BD
        ///Retorno: 
        ///Excepciones posibles: 
        ///SqlException: Atrapa los errores que pueden existir en el sql server internamente
        ///Excepcion particular1: 
        ///ManejoBDException: Atrapa los errores que pueden existir al iniciar conexión
        ///</sumary>
        private void IniciarConexion()
        {
            try
            {
                _conexion.ConnectionString = this._stringConexion;
                _conexion.Open();
            }
            catch (SqlException)
            {
                throw new ManejoBDException("0001", "Error al abrir conexion");
            }
            catch (Exception)
            {
                throw new ManejoBDException("0001", "Error al abrir conexion");
            }

        }
        #endregion


        #region CerrarConexion

        ///<sumary>
        ///Método que se encarga de cerrar la conexion con la BD 
        ///Retorno: 
        ///Excepciones posibles: 
        ///SqlException: Atrapa los errores que pueden existir en el sql server internamente
        ///Excepcion particular1: 
        ///ManejoBDException: Atrapa los errores que pueden existir al cerrar conexión
        ///</sumary>
        private void CerrarConexion()
        {
            try
            {
                this._conexion.Close();
            }
            catch (SqlException)
            {
                throw new ManejoBDException("0002", "Error al cerrar conexion");
            }
            catch (Exception)
            {
                throw new ManejoBDException("0002", "Error al cerrar conexion");
            }
        }
        #endregion

        #region OperacionesBD

        ///<sumary>
        ///Método que se encarga de ejecutar un procedimiento almacenado 
        ///para el manejo de los objetos de la base de datos
        ///Parámetros: 
        ///Lista parametros: datos que introduce el usuario 
        ///Retorno:
        ///Bool: Devuelve true o false dependiendo del caso
        ///Excepciones posibles: 
        ///SqlException: Atrapa los errores que pueden existir en el sql server internamente
        ///Excepcion particular1: 
        ///ManejoBDException: Atrapa los errores que pueden existir al ejecutar el procedimiento 
        ///</sumary>
        public bool EjecutarStoreProcedure(List<Parametro> listaParametros)
        {
            bool completo = false;
            try
            {
                IniciarConexion();

                _comando = new SqlCommand(_query, _conexion);
                _comando.CommandType = CommandType.StoredProcedure;

                for (int i = 0; i < listaParametros.Count; i++)
                {
                    AsignarParametroAComando(_comando, listaParametros[i]);
                }

                _comando.ExecuteNonQuery();

                completo = true;
                return completo;

            }
            catch (SqlException)
            {
                throw new ManejoBDException("0003", "Error al ejecutar procedure");
            }
            catch (Exception)
            {
                throw new ManejoBDException("0003", "Error al ejecutar procedure");
            }
            finally
            {
                CerrarConexion();
            }
        }



        ///<sumary>
        ///Método que se encarga de la obtencion de las consultas realizadas por el usuario 
        ///Parámetros: 
        ///List<Parametro> parametros: listado de parametros 
        ///SqlCommand Comando: Comando sql 
        ///Parametro parametro: tipo de parametro. Valores que pueden ser: string, int y datetime
        ///Retorno:
        ///DataTable resultado: registros obtenidos
        ///Excepciones posibles: 
        ///SqlException: Atrapa los errores que pueden existir en el sql server internamente
        ///Excepcion particular1: 
        ///ManejoBDException: Atrapa los errores que pueden existir al ejecutar el procedimiento 
        ///</sumary>
        public DataTable Consultas(List<Parametro> parametros)
        {
            try
            {
                IniciarConexion();

                SqlDataAdapter data = new SqlDataAdapter(_query, _conexion);
                data.SelectCommand.CommandType = CommandType.StoredProcedure;

                for (int i = 0; i < parametros.Count; i++)
                {
                    AsignarParametroADataAdapter(data, parametros[i]);
                }

                DataTable resultado = new DataTable();
                data.Fill(resultado);

                return resultado;

            }
            catch (SqlException)
            {
                throw new ManejoBDException("0004", "Error al realizar consulta");
            }
            catch (Exception)
            {
                throw new ManejoBDException("0004", "Error al realizar consulta");
            }
            finally
            {
                CerrarConexion();
            }
        }

        #endregion

        #region Procedimientos Privados

        ///<sumary>
        ///Método que se encarga de validar la asignacion de los parametros al comando sql 
        ///Parámetros: 
        ///SqlCommand Comando: Comando sql 
        ///Parametro parametro: tipo de parametro. Valores que pueden ser: string, int y datetime     
        ///</sumary>
        private void AsignarParametroAComando(SqlCommand comando, Parametro parametro)
        {
            if ((parametro.ValorString == "") && (parametro.ValorDateTime == null))
            {
                comando.Parameters.AddWithValue(parametro.EtiquetaParametro, parametro.ValorInt);
            }

            if ((parametro.ValorInt == -1) && (parametro.ValorDateTime == null))
            {
                comando.Parameters.AddWithValue(parametro.EtiquetaParametro, parametro.ValorString);
            }

            if ((parametro.ValorString == "") && (parametro.ValorInt == -1))
            {
                comando.Parameters.AddWithValue(parametro.EtiquetaParametro, parametro.ValorDateTime);
            }
        }

        private void AsignarParametroADataAdapter(SqlDataAdapter data, Parametro parametro)
        {
            if ((parametro.ValorString == "") && (parametro.ValorDateTime == null))
            {
                data.SelectCommand.Parameters.AddWithValue(parametro.EtiquetaParametro, parametro.ValorInt);
            }

            if ((parametro.ValorInt == -1) && (parametro.ValorDateTime == null))
            {
                data.SelectCommand.Parameters.AddWithValue(parametro.EtiquetaParametro, parametro.ValorString);
            }

            if ((parametro.ValorString == "") && (parametro.ValorInt == -1))
            {
                data.SelectCommand.Parameters.AddWithValue(parametro.EtiquetaParametro, parametro.ValorDateTime);
            }
        }
        #endregion

    }
}